#include "bsp.h"

/***************************************************************************************************
 * @fn      config_uart_nvic
 *
 * @brief   配置串口硬件中断
 *
 * @param	无
 *
 * @return	无
 */
static void config_uart_nvic(void)
{
    nvic_irq_enable(USART5_IRQn, 1, 0);  /* 使能串口中断，设置优先级 */
}

/***************************************************************************************************
 * @fn      uart_init_hard
 *
 * @brief   配置串口的硬件参数（波特率，数据位，停止位，起始位，校验位，中断使能）
 *
 * @param	无
 *
 * @return	无
 */
static void uart_init_hard(void)
{
    /* 串口1 TX = PA9   RX = PA10 或 TX = PB6   RX = PB7*/
    rcu_periph_clock_enable(RCU_GPIOA);  /* 使能GPIO时钟 */
    rcu_periph_clock_enable(RCU_USART5); /* 使能串口时钟 */

    gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_11);
    gpio_af_set(GPIOA, GPIO_AF_8, GPIO_PIN_12);
    
    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_11);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11);

    gpio_mode_set(GPIOA, GPIO_MODE_AF, GPIO_PUPD_PULLUP, GPIO_PIN_12);
    gpio_output_options_set(GPIOA, GPIO_OTYPE_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12);
    
    /* 配置USART的参数 */
    usart_deinit(USART5);  /* RCU配置恢复默认值 */
    usart_baudrate_set(USART5, 115200);  /* 设置波特率 */
    usart_stop_bit_set(USART5, USART_STB_1BIT);  /* 设置停止位 */
    usart_word_length_set(USART5, USART_WL_8BIT);  /* 设置数据字长度 */
    usart_parity_config(USART5, USART_PM_NONE);  /* 设置奇偶校验位 */
    usart_receive_config(USART5, USART_RECEIVE_ENABLE);  /* 使能接收 */
    usart_transmit_config(USART5, USART_TRANSMIT_ENABLE);  /* 使能发送 */

    usart_interrupt_enable(USART5, USART_INT_RBNE);  /* 使能接收缓冲区非空中断 */

    usart_enable(USART5);  /* 使能串口 */
}

/***************************************************************************************************
 * @fn      bsp_init_print
 *
 * @brief   初始化串口硬件，并对全局变量赋初值
 *
 * @param	无
 *
 * @return	无
 */
void bsp_init_uart2(void)
{
    uart_init_hard();  /* 配置串口的硬件参数(波特率等) */

    config_uart_nvic();  /* 配置串口中断 */
}


/***************************************************************************************************
 * @fn      USART5_IRQHandler
 *
 * @brief   串口中断服务程序
 *
 * @param   无
 *
 * @return  无
 */
void USART5_IRQHandler(void)
{
    uint8_t ch;

    /* 处理接收中断  */
    if(usart_interrupt_flag_get(USART5, USART_INT_FLAG_RBNE) != RESET)
    {
        usart_interrupt_flag_clear(USART5, USART_INT_FLAG_RBNE);

        /* 从串口接收数据寄存器读取数据存放到接收FIFO */
        ch = usart_data_receive(USART5);
        
        if (ch)
            ;
    }

    /* 溢出错误标志为1 */
    if(usart_interrupt_flag_get(USART5, USART_INT_FLAG_ERR_ORERR) == SET)       
    {                                                         
        usart_interrupt_flag_clear(USART5, USART_INT_FLAG_ERR_ORERR);  /* 清除溢出错误标志 */
        usart_data_receive(USART5);  /* 读取USART_DATA */ 
    }
}
